FIT2-2022b 第03回 イベントループ
前回授業の復習
for文、if文
code: python
import pyxel
pyxel.init(200, 200)
pyxel.cls(7)
for x in range(10, 191, 20):
for y in range(10, 191, 20):
if (x + y) % 40 == 0:
pyxel.circ(x, y, 10, 14)
else:
pyxel.circ(x, y, 10, 6)
pyxel.flip()
pyxel.show()
x = 10で固定しつつ、yを10, 30, 50... と増やしながら円を描画
x = 30で固定しつつ、yを10, 30, 50... と増やしながら円を描画
x = 50で固定しつつ…
同上
リサージュ図形
端的に言えば x=sin2θ, y=cos3θ という数式を定義し、θを0から359まで回したときの軌跡を描きましょう、という話
sinθ, cosθは0~1の値しかとらないため、画面に描画するためには拡大が必要
code:python
import pyxel
# 中心座標を管理するために画面サイズを変数で管理
screen_size = 200
center_x = screen_size / 2
center_y = screen_size / 2
zoom = screen_size / 2
# screen_sizeを使って画面サイズを定義
pyxel.init(screen_size, screen_size)
pyxel.cls(7)
# thetaの値を0度から359まで変化させる (※theta 0 = 360と同値)
for theta in range(360):
# 始点はcenter_x, center_y
# 終点座標を sin2θ, cos3θとすると画面左上を中心とした図形になってしまうため、中心座標に移動
# さらにsin2θ, cos3θは数値が0~1の範囲に留まってしまうため、zoom倍することで拡大している
pyxel.line(center_x,
center_y,
center_x + zoom * pyxel.sin(2 * theta),
center_y + zoom * pyxel.cos(3 * theta),
0)
pyxel.flip()
pyxel.show()
for1回でしいたけ描画
https://gyazo.com/5f2dde7148d23b3b6de6fa4af91e6bbb
考え方
外周を見るとシンプルな「円」
角度に応じて始点を (80, 80), (80, 120), (120, 80), (120, 120) と変えながら、終点を円の外周に
外周の座標を求めるには…
(θ, x, y) = (θ, cos(θ), sin(θ))
解法
①θを0〜360度まで回しつつ、θの値を見て90度ごとに始点を変える
code:python
import pyxel
pyxel.init(200, 200)
pyxel.cls(7)
for i in range(360):
if i <= 90:
pyxel.line(120, 120, 100 + 100 * pyxel.cos(i), 100 + 100 * pyxel.sin(i), 0)
elif i <= 180:
pyxel.line(80, 120, 100 + 100 * pyxel.cos(i), 100 + 100 * pyxel.sin(i), 0)
elif i <= 270:
pyxel.line(80, 80, 100 + 100 * pyxel.cos(i), 100 + 100 * pyxel.sin(i), 0)
else:
pyxel.line(120, 80, 100 + 100 * pyxel.cos(i), 100 + 100 * pyxel.sin(i), 0)
pyxel.flip()
pyxel.show()
②θを0~90度まで回しつつ、1/4円を同時に4つ描画する
code:python
import pyxel
screen_size = 200
center_x = screen_size / 2
center_y = screen_size / 2
zoom = 100
pyxel.init(screen_size, screen_size)
pyxel.cls(7)
for i in range(90):
pyxel.line(120, 120, center_x + zoom * pyxel.cos(i), center_y + zoom * pyxel.sin(i), 0)
pyxel.line(80, 120, center_x + zoom * pyxel.cos(i + 90), center_y + zoom * pyxel.sin(i + 90), 0)
pyxel.line(80, 80, center_x + zoom * pyxel.cos(i + 180), center_y + zoom * pyxel.sin(i + 180), 0)
pyxel.line(120, 80, center_x + zoom * pyxel.cos(i + 270), center_y + zoom * pyxel.sin(i + 270), 0)
pyxel.flip()
pyxel.show()
第三回講義
https://gyazo.com/d41baa694b2de86ead0479089274c317
前回授業は「単なる図形描画のみ」今回から「動き」の再現の仕方を学んでいきます
updateとdrawを分離するメリットって?
一番はコードの可読性/メンテナンス性
数値計算は数値計算に専念、画面描画は画面描画に専念することでコードが大きくなったときの見通しが良くなる
関数定義を利用して、意味のある単位で可能な限り処理は小出しで分離することが美徳
頑張って英語を読みたまへ、ということです
タイピングテスト
課題提出
B-7-4まで!
B-7-3, B-7-4は応用問題なので必須ではありません◎
とはいえこれも採点範囲に含まれるためSを取りたければ是非解いてみてください